layui.define(function (exports) {
    layui.use(['progressBar', 'upload', 'element', 'setter'], function () {
        var $ = layui.$;
        var progressBar = layui.progressBar;
        var upload = layui.upload;
        var setter = layui.setter;

        var qiniuToken = null;

        var qiniuDomain = "http://7xsx94.com2.z0.glb.qiniucdn.com";

        var Requests = {
            getQiniuTokenRequest: function () {
                var index = layui.layer.load(2);
                return $.ajax({
                    url: setter.apiHost + "/api/qiniu/token",
                    type: "get",
                    success: function (view) {
                        qiniuDomain = view.domain;
                        qiniuToken = view.token;
                    },
                    error: function (xmlReq) {
                    },
                    complete: function () {
                        layui.layer.close(index);
                    }
                })
            }
        }

        exports("uploader", {
            /**
             * 绑定上传组件
             * @param id
             * @param previewId
             * @param success
             */
            bind: function (options) {
                var dfp = {
                    btnId: ""   //绑定上传按钮
                    , progressBarId: "" //进度条ID
                    , multi: false  //是否允许多文件上传
                    , accept: "images" //指定允许上传时校验的文件类型，可选值有：images（图片）、file（所有文件）、video（视频）、audio（音频）
                    , exts: "jpg|png|gif|bmp|jpeg" //允许上传的文件后缀。一般结合 accept 参数类设定。假设 accept 为 file 类型时，那么你设置 exts: 'zip|rar|7z' 即代表只允许上传压缩格式的文件。如果 accept 未设定，那么限制的就是图片的文件格式
                    , before: function (obj) {

                    }
                    , success: function (imgurl) {

                    }
                    , complete: function (imgUrls) {

                    }
                }

                var params = $.extend(true, {}, dfp, options);


                if (!qiniuToken) {
                    Requests.getQiniuTokenRequest();
                }

                var imgLinks = [];

                upload.render({
                    elem: params.btnId
                    , url: ''
                    , multiple: params.multi
                    , auto: false
                    , accept: params.accept
                    , exts: params.exts
                    , choose: function (object) {
                        params.before(object);

                        //创建进度条
                        var pb = progressBar.create(params.progressBarId);
                        pb.show();

                        //获得文件队列
                        var files = object.pushFile();
                        //文件总数
                        var count = 0;
                        for (var key in files) {
                            count++;
                        }
                        //每个文件占总数比例
                        var per = (100 / count).toFixed(2);
                        //当前文件序号
                        var i = 1;

                        object.preview(function (index, file, result) {
                            console.log(file); //得到文件对象

                            //执行上传
                            var observable = qiniu.upload(file, file.name, qiniuToken
                                , {
                                    fname: "",
                                    params: {},
                                    mimeType: [] || null
                                }, {})

                            observable.subscribe({
                                next: function (res) {
                                    //单选文件进度条
                                    if (!params.multi) {
                                        var total = res.total;
                                        var percent = (total.percent).toFixed(2) + "%";
                                        console.log("percent:", percent);
                                        pb.percent(percent)
                                    }

                                },
                                error: function (err) {
                                    console.log(err);
                                    layer.alert("上传失败");
                                    pb.remove();
                                    params.complete(err);
                                },
                                complete: function (res) {
                                    console.log("com res:", res)
                                    var key = res.key;

                                    var imgLink;
                                    if (params.accept === 'images'){
                                        imgLink = qiniu.imageMogr2({
                                            "auto-orient": true,      // 布尔值，是否根据原图EXIF信息自动旋正，便于后续处理，建议放在首位。
                                            strip: true,              // 布尔值，是否去除图片中的元信息
                                            thumbnail: '300x400',    // 缩放操作参数
                                            quality: 80,              // 图片质量，取值范围1-100
                                            format: 'jpg'            // 新图的输出格式，取值范围：jpg，gif，png，webp等
                                        }, key, qiniuDomain)
                                    } else {
                                        imgLink = qiniuDomain + "/" + key;
                                    }

                                    //单选文件则删除进度条
                                    if (!params.multi) {
                                        pb.remove();
                                    } else {
                                        //多选文件则进度条+1
                                        pb.percent((per * i).toFixed(2) + "%");
                                    }
                                    i++;

                                    //如果当前序号为最后一个文件则删除进度条
                                    if (count <= i) {
                                        pb.remove();
                                    }

                                    //删除队列中的这个文件
                                    delete files[index];

                                    //执行回调
                                    params.success(imgLink);

                                    imgLinks.push(imgLink);

                                    if (count == (i - 1)) {
                                        params.complete(imgLinks)
                                    }
                                }
                            })
                        });
                    }
                    , done: function (res, index, upload) { //上传后的回调
                    }
                    //,accept: 'file' //允许上传的文件类型
                    //,size: 50 //最大允许上传的文件大小
                    //,……
                })

            }
        })
    })
})